package ginplus

import "reflect"

type iController interface {
	iController()
}

// RestController 继承该控制器的结构体给浏览器返回JSON类型数据
// 示例代码：ctx.JSON(http.StatusOK, nil)
type RestController interface {
	iController
	restController()
}

// 编译校验：确保 Controller 完全实现了 iController 接口所有方法，如果有遗漏，编译报错
//var _ iController = (*Controller)(nil)

// Controller 继承该控制器的结构体可以跳转html页面，给浏览器返回html类型响应
// 示例代码：ctx.HTML(http.StatusOK, "index.html", nil)
type Controller interface {
	iController
	controller()
}

// ModelAndView 使用Controller作为父类控制器时的返回值
// 也可以返回string，会被当作html路径解析
type ModelAndView struct {
	View       string `json:"view"`       // html路径
	Model      any    `json:"model"`      // 渲染的参数
	HttpStatus int    `json:"httpStatus"` // http响应码
}

// 声明一个 mappingHandler 接口，该接口是一个映射处理器类型
// 推荐使用以下 Get、Post、Put、Delete 四种类型声明处理器类型
type mappingHandler interface {
	mapping()
}

type Get struct{}

func (Get) mapping() {}

type Post struct{}

func (Post) mapping() {}

type Put struct{}

func (Put) mapping() {}

type Delete struct{}

func (Delete) mapping() {}

var (
	mappingHandlerRt = reflect.TypeOf((*mappingHandler)(nil)).Elem()
	getRt            = reflect.TypeOf((*Get)(nil)).Elem()
	postRt           = reflect.TypeOf((*Post)(nil)).Elem()
	putRt            = reflect.TypeOf((*Put)(nil)).Elem()
	deleteRt         = reflect.TypeOf((*Delete)(nil)).Elem()
)
